package cn.com.dashihui.api.controller;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.concurrent.Callable;


import com.jfinal.aop.Clear;
import com.jfinal.core.Const;
import com.jfinal.kit.HttpKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.jfinal.weixin.sdk.api.JsTicket;
import com.jfinal.weixin.sdk.utils.RetryUtils;

import cn.com.dashihui.api.base.BaseController;
import cn.com.dashihui.api.common.ResultField;
import cn.com.dashihui.api.common.ResultMap;
import cn.com.dashihui.api.common.ResultState;
import cn.com.dashihui.api.common.SysConfig;
import cn.com.dashihui.api.dao.ApiClient;
import cn.com.dashihui.api.dao.User;
import cn.com.dashihui.api.dao.Version;
import cn.com.dashihui.api.interceptor.AuthClientTokenInterceptor;
import cn.com.dashihui.api.service.CommonService;
import cn.com.dashihui.kit.CommonKit;
import net.sf.json.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;

public class CommonController extends BaseController{
	private CommonService service = new CommonService();
	
	
	/**
	 * 测试链接
	 * 用于客户端测试服务器状态，以判断服务器是否可以正常响应，直接返回成功即可
	 * @return 0：正常
	 */
	@Clear
	public void test(){
		
//		new cn.com.dashihui.pay.OUT.test().demo();
		
		
//		Cache orderCache = Redis.use();
//		Jedis jedis = orderCache.getJedis();
//		
//		int id = 30;
//		String teamNum = "201910301540004"+"teamsize"+id;
//		//删除大团
//		jedis.del("team"+id);
//		//检查teaminteam+id  存放该商品 订单未免单id集合，判断什么时候大团免单
//		jedis.del("teaminteam" + id);
//		//删除
////		String TEAMSIZE = "teamsize"; //teamNum+teamsize+id 存放该团中团成员订单id
//		System.out.println(jedis.get(teamNum));
		 
		renderSuccess();
	}
	
	
	
	
	
	@Clear
	public void redisDemo() {
	
		  // 获取名称为news的Redis Cache对象
		  Cache newsCache = Redis.use("redis");
		  // 最先创建的Cache将成为主Cache，所以可以省去cacheName参数来获取
//		  Object object = newsCache.get(ESRedisPlugin.defualtCacheName);
//		  newsCache.set("k", "vdd=666==d");
//		  newsCache.del("k");
		  
		  System.out.println(newsCache+"");
		  System.out.println(newsCache.get("k")+"");
		  renderSuccess();

		}
	

    
	/**
	 * 终端注册
	 * 用户第一次使用客户端时，客户端向服务器提交该终端的相关信息
	 * @param BRAND 品牌
	 * @param MODEL 型号
	 * @param OS 操作系统
	 * @param OSVERSION 系统版本
	 * @param SCREEN 屏幕尺寸
	 * @param RESOLUTION 分辨率
	 * @param MIDU 屏幕密度
	 * @param UQID 设备识别号，Android对应IMEI，iPhone对应设备号
	 * @param OSID 系统ID号，Android专用
	 * @param TVERSION 终端版本号，客户端当前使用的版本号
	 * @param TYPE 终端类型，A.Android B.iPhone C.iPad
	 * @return SIGNATURE 设备识别码，针对系统该设备的身份标示
	 */
	@Clear(AuthClientTokenInterceptor.class)
    public void regist(){
		
    	//判断入参设备识别号已经记录过，则直接使用其设备识别码
    	ApiClient client = service.findClientByUqid(getPara("UQID"));
    	if(client!=null){
    		//更新使用客户端版本号
    		client.set("tversion", getPara("TVERSION")).update();
    		renderSuccess(ResultMap.newInstance().put(ResultField.FIELD_CLIENT_TOKEN,client.get("ID")));
    		return;
    	}
    	//如果没有，则新生成设备识别码，并创建新记录
    	String clientid = CommonKit.getUUID().concat(CommonKit.randomNum(4));
    	if(new ApiClient()
    			.set("id", clientid)
    			.set("brand", getPara("BRAND"))
    			.set("model", getPara("MODEL"))
    			.set("os", getPara("OS"))
    			.set("osversion", getPara("OSVERSION"))
    			.set("screen", getPara("SCREEN"))
    			.set("resolution", getPara("RESOLUTION"))
    			.set("midu", getPara("MIDU"))
    			.set("uqid", getPara("UQID"))
    			.set("osid", getPara("OSID"))
    			.set("tversion", getPara("TVERSION"))
    			.set("type", getPara("TYPE"))
    			.save()){
    		renderSuccess(ResultMap.newInstance().put(ResultField.FIELD_CLIENT_TOKEN,clientid));
    		return;
    	}
    	renderResult(ResultState.STATE_CLIENT_REGIST_FAILED,"终端注册失败");
    }
    
    /**
     * 检查版本更新，判断是否有比入参最新的版本信息
     * @param TYPE 平台，A.Android B.iPhone C.iPad
     * @param VERSION 当前客户端版本号
     * @return 
     */
    public void checkVersion(){
    	String typeStr = getPara("TYPE");
    	String versionStr = getPara("VERSION");
    	if(StrKit.isBlank(typeStr)){
    		renderFailed("参数TYPE不能为空");
    		return;
    	}else if(!typeStr.equals("A")&&!typeStr.equals("B")&&!typeStr.equals("C")){
    		renderFailed("参数TYPE不正确");
    		return;
    	}else if(StrKit.isBlank(versionStr)){
    		renderFailed("参数VERSION不能为空");
    		return;
    	}else if(!versionStr.matches("[1-9]{1,3}\\.\\d{1,3}\\.\\d{1,5}")){
    		renderFailed("参数VERSION格式不正确");
    		return;
    	}
    	String[] versionArr = versionStr.split("\\.");
    	int iVersionPart1 = Integer.valueOf(versionArr[0]), iVersionPart2 = Integer.valueOf(versionArr[1]), iVersionPart3 = Integer.valueOf(versionArr[2]);
    	//查询指定平台客户端的最新版本信息
    	Version lastVersion = service.findLastVersion(typeStr);
    	if(lastVersion!=null){
    		int lVersionPart1 = lastVersion.getInt("versionPart1"), lVersionPart2 = lastVersion.getInt("versionPart2"), lVersionPart3 = lastVersion.getInt("versionPart3");
    		//将数据库中的最新版本信息的版本号三个部分，与入参的版本号三个部分进行比较，判断数据库中的最新版本信息是否比入参版本号要大
    		if(lVersionPart1>iVersionPart1
    				||(lVersionPart1==iVersionPart1&&lVersionPart2>iVersionPart2)
    				||(lVersionPart1==iVersionPart1&&lVersionPart2==iVersionPart2&&lVersionPart3>iVersionPart3)){
    			renderSuccess(ResultMap.newInstance()
    					.put("UPDATEFLG",lastVersion.getInt("updateFlag")==1?"C":"B")
    					.put("CURVER", CommonKit.join(".",lVersionPart1,lVersionPart2,lVersionPart3))
    					.put("DOWNURL", lastVersion.get("downurl"))
    					.put("UPDATELOG", CommonKit.ifNull(lastVersion.get("updatelog")))
    					.put("RELEASEDATE", lastVersion.getDate("releaseDate")));
    			return;
    		}
    	}
		renderSuccess(ResultMap.newInstance().put("UPDATEFLG","A"));
    }
    
    /**
	 * 获取默认社区的百度位置主键（IOS应付上线专用）
	 * @return SIGNATURE 设备识别码，针对系统该设备的身份标示
	 */
    public void defLocation(){
    	Prop prop = new Prop("realtime.properties",Const.DEFAULT_ENCODING);
		renderSuccess(ResultMap.newInstance().put("BAIDUKEY",prop.get("defLocation",null)));
    }
    
    /**
     * 查询指定数量的店铺信息，供客户端展示（考虑到客户端上有些用户禁用定位）
     * @param KEYWORD 关键字
     */
    public void lbs(){
		String keyword = getPara("KEYWORD");
		//返回
		renderSuccess(service.findAllLBSData(keyword));
    }
    /**
     * 查询所有分类
     */
    public void category(){
		String storeidStr = getPara("STOREID");
		int isSelf = getParaToInt("ISSELF",0);
		if(StrKit.isBlank(storeidStr)){
    		renderFailed("参数STOREID不能为空");
    		return;
		}
		renderSuccess(service.findAllCategory(Integer.valueOf(storeidStr).intValue(), isSelf));
    }
    
    /**
     * 意见反馈
     * @param CONTEXT 反馈内容
     */
    public void feedback(){
    	String context = getPara("CONTEXT");
    	if(StrKit.isBlank(context)){
    		renderFailed("反馈内容不能为空");
    		return;
    	}else if(context.length()>500){
    		renderFailed("反馈内容太长了，请精简您的内容在500字以内");
    		return;
    	}
    	//如果当前有登录用户，则同时记录用户ID
    	User user = getCurrentUser();
    	if(service.feedback(context, (user!=null?user.getInt("id"):0))){
    		//返回
    		renderSuccess();
    		return;
    	}
		renderFailed("提交反馈失败");
    }
    
    /**
     * 查询版本记录
     */
    public void versions(){
    	renderSuccess(service.queryAllVersion());
    }
    /**
     * 查询兑换比例
     */
    public void queryScale(){
    	  //查询惠券转余额比例信息
    	Double scale1=0.00;
		try {
			scale1 = SysConfig.getscale1();
		} catch (Exception e) {
			renderFailed("惠券转余额比例查询失败");
			return;
		}
    	Record scale=service.queryScale();
    	renderSuccess(ResultMap.newInstance().put("scale1",scale1).put("scale", scale));
    }
    
    /**
     * 查询默认推荐人手机号
     */
    public void queryDefaultInvite(){
    	String defaultInvite="";
    	try {
    		defaultInvite=SysConfig.getDefaultInvite();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			renderFailed("请输入推荐人手机号");
			return;
		}
    	renderSuccess(defaultInvite);
    }
    
    /**
     * 微信公众号页面获取配置参数
     */
    public void getConfig(){
    	String AppId=PropKit.get("PWXPAY.appid");//第三方用户唯一凭证  
        //2、获取Ticket  
        String jsapi_ticket = getTicket();  
          
        //3、时间戳和随机字符串  
        String noncestr = System.currentTimeMillis() + "";//随机字符串  
        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳  
          
        System.out.println("jsapi_ticket:"+jsapi_ticket+"\n时间戳："+timestamp+"\n随机字符串："+noncestr);  
          
        //4、获取url  
        String url=getPara("URL");
          
        //5、将参数排序并拼接字符串  
        String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;  
         
        //6、将字符串进行sha1加密  
        String signature =SHA1(str);  
        System.out.println("参数："+str+"\n签名："+signature);    
	        renderSuccess(ResultMap.newInstance()
					.put("APPID",AppId)
					.put("SIGNATURE",signature )
					.put("NONCESTR", noncestr)
					.put("TIMESTAMP", timestamp));
	        return;
		
        
    }
    
    /**
	 * 公众号页面获取JsTicket
	 */
	public String getTicket() {
		JsTicket jsTicket=getSessionAttr("jsTicket");
		if (null == jsTicket || !jsTicket.isAvailable()) {
            // 最多三次请求
            jsTicket = RetryUtils.retryOnException(3, new Callable<JsTicket>() {

                @Override
                public JsTicket call() throws Exception {
                	//URL
            		String requestUrl = PropKit.get("PWXPAY.JsTicket");
            		String access_token=getAccessToken(); 
            		//请求参数
                    String params = "access_token=" + access_token + "&type=jsapi";
                    //发送请求
                    String data = HttpKit.get(requestUrl+params);
                    //解析相应内容（转换成json对象）
//                    JSONObject  json = JSONObject.fromObject(data);
//                    String ticket = String.valueOf(json.get("ticket"));//获取ticket
                    JsTicket jsTicket=new JsTicket(data);
                    setSessionAttr("jsTicket", jsTicket);
                    return jsTicket;
                }
            });
        }
        String ticket=jsTicket.getTicket();
        System.out.println("获取到的ticket:"+ticket);
        return ticket;
        
	}
	
	/**
	 * 公众号页面获取access_token
	 * 
	 */
	public String getAccessToken() {
		String access_token = "";  
	    String grant_type = "client_credential";//获取access_token填写client_credential   
	    String AppId=PropKit.get("PWXPAY.appid");//第三方用户唯一凭证  
	    String secret=PropKit.get("PMPWX.AppSecret");//第三方用户唯一凭证密钥，即appsecret   
	    //这个url链接地址和参数皆不能变  
	    String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+AppId+"&secret="+secret;  
	    //发送请求
        String data = HttpKit.get(url);
        System.out.println("请求access_token的结果:"+data);
        //解析相应内容（转换成json对象）
        JSONObject  json = JSONObject.fromObject(data);
	    access_token= String.valueOf(json.get("access_token"));
	    System.out.println("获取到的access_token:"+access_token);
	    return access_token; 
	}
	
	/**
	 * 加密
	 */
	public static String SHA1(String decript) {  
	    try {  
	        MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");  
	        digest.update(decript.getBytes());  
	        byte messageDigest[] = digest.digest();  
	        // Create Hex String  
	        StringBuffer hexString = new StringBuffer();  
	        // 字节数组转换为 十六进制 数  
	            for (int i = 0; i < messageDigest.length; i++) {  
	                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);  
	                if (shaHex.length() < 2) {  
	                    hexString.append(0);  
	                }  
	                hexString.append(shaHex);  
	            }  
	            return hexString.toString();  
	   
	        } catch (NoSuchAlgorithmException e) {  
	            e.printStackTrace();  
	        }  
	        return "";  
	}  
	/**
	 * 查询充值卡
	 */
	public void rechargeList(){
		List<Record> rechargeList=service.rechargeList();
		if (rechargeList!=null&&rechargeList.size()>0) {
			renderSuccess(rechargeList);
		}else {
			renderFailed("暂不可充值");
		}
	}
}
